/*
 * FileName：TplMsgTextCtrl.java 
 * <p>
 * Copyright (c) 2017-2020, <a href="http://www.webcsn.com">hermit (794890569@qq.com)</a>.
 * <p>
 * Licensed under the GNU General Public License, Version 3 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.gnu.org/licenses/gpl-3.0.html
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */
package com.wxmp.wxcms.ctrl;

import java.util.*;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.wxmp.core.exception.WxError;
import com.wxmp.core.exception.WxErrorException;
import com.wxmp.wxapi.process.MpAccount;
import com.wxmp.wxapi.process.WxApi;
import com.wxmp.wxapi.process.WxApiClient;
import com.wxmp.wxapi.process.WxMemoryCacheClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.wxmp.core.common.BaseCtrl;
import com.wxmp.core.exception.BusinessException;
import com.wxmp.core.util.AjaxResult;
import com.wxmp.wxcms.domain.TplMsgText;
import com.wxmp.wxcms.service.TplMsgTextService;

/**
 *
 * @author hermit
 * @version 2.0
 * @date 2018-04-17 10:54:58
 */
@Controller
@RequestMapping("/tplmsgtext")
public class TplMsgTextCtrl extends BaseCtrl {

	Logger logger = LoggerFactory.getLogger(TplMsgTextCtrl.class);

	@Autowired
	private TplMsgTextService entityService;
	

	@ResponseBody
	@RequestMapping(value = "/getById")
	public AjaxResult getById(String id){
		TplMsgText text = entityService.getById(id);
		return AjaxResult.success(text);
	}

	@ResponseBody
	@RequestMapping(value = "/list")
	public  AjaxResult list(TplMsgText searchEntity) throws BusinessException{
		List<TplMsgText> pageList = entityService.getTplMsgTextByPage(searchEntity);
		return getResult(searchEntity,pageList);
	}


	/**
	 * 修改/添加
	 * @param entity
	 * @return
	 */
	@RequestMapping(value = "/updateText")
	@ResponseBody
	public AjaxResult updateText(TplMsgText entity){
		if (entity.getId() != null) {
			entityService.update(entity);
			//更新成功
			return AjaxResult.updateSuccess();
		} else {
			//添加成功
			entityService.add(entity);
			return AjaxResult.saveSuccess();
		}
	}

	@RequestMapping(value = "/deleteById")
	@ResponseBody
	public AjaxResult deleteById(String baseId) {
		entityService.delete(baseId);
		return AjaxResult.deleteSuccess();
	}

	/**
	* @Description:
	* @author chenchen
	* @date 2019/3/20 10:59
	*/
	@RequestMapping(value = "/synTplMsg")
	@ResponseBody
	public AjaxResult synTplMsg() throws Exception {
		logger.debug("获取腾讯后台模板id");
		MpAccount mpAccount = WxMemoryCacheClient.getMpAccount();//获取缓存中的唯一账号
		String accessToken = WxApiClient.getAccessToken(mpAccount);
		logger.info("获取用户信息接口accessToken：" + accessToken);
		String url = WxApi.getTplMsgUrl(accessToken);
		logger.info("获取用户信息接口url：" + url);
		JSONObject jsonObj = WxApi.httpsRequest(url, "GET", null);
		Set<String> txTplSet = new HashSet<>();
		Map<String, TplMsgText> txMap = new HashMap<>();
		Set<String> localTplSet = new HashSet<>();
		if(null != jsonObj) {
			if (jsonObj.containsKey("errcode")) {
				throw new WxErrorException(WxError.fromJson(jsonObj));
			} else {
				JSONArray arr = jsonObj.getJSONArray("template_list");
				for(int i=0; i<arr.size(); i++) {
					JSONObject msg = arr.getJSONObject(i);
					txTplSet.add(msg.getString("template_id"));
					TplMsgText tm = new TplMsgText();
					tm.setTplId(msg.getString("template_id"));
					tm.setTitle(msg.getString("title"));
					tm.setWxTpl(msg.getString("content"));
					txMap.put(msg.getString("template_id"), tm);
				}
			}
		}
		logger.debug("获取本地数据库模板id");
		List<TplMsgText> pageList = entityService.getTplMsgTextByPage(new TplMsgText());
		for(TplMsgText tm : pageList) {
			localTplSet.add(tm.getTplId());
		}
		Set<String> tx_redundant = new HashSet<String>();
		Set<String> local_redundant = new HashSet<String>();
		tx_redundant.addAll(txTplSet);
		local_redundant.addAll(localTplSet);
		tx_redundant.removeAll(localTplSet);
		local_redundant.removeAll(txTplSet);
		logger.debug("将tx_redundant补到本地数据库");
		for(String tpId : tx_redundant) {
			entityService.add(txMap.get(tpId));
		}
		logger.debug("将local_redundant从本地数据库删除");
		for(String tplId : local_redundant) {
			entityService.deleteByTplId(tplId);
		}
		return AjaxResult.success();
	}

}
